/**
 * @file led.s
 * @brief 裸机实验1 汇编点灯
          使用汇编来电量开发板上的 LED灯，学习和掌握如何使用汇编语言来完成对 I.MX6U
          处理器的 GPIO 初始化和控制
 * @author: He Chuanxi
 * @version: V1.0
 * @note
 */

.global _start /* 全局标号 */

/**
 * @brief _start 函数，程序从此函数开始执行此函数完成时钟使能、GPIO 初始化、最终控制
 *        GPIO 输出低电平来点亮 LED 灯.
 */
_start:
    /* 例程代码 */
    /* 1.使能所有时钟 */
    ldr r0, =0x020C4068 /* 寄存器 CCGR0 */
    ldr r1, =0xFFFFFFFF
    str r1, [r0]

    ldr r0, =0x020C406C /* 寄存器 CCGR1 */
    str r1, [r0]

    ldr r0, =0x020C4070 /* 寄存器 CCGR2 */
    str r1, [r0]

    ldr r0, =0x020C4074 /* 寄存器 CCGR3 */
    str r1, [r0]

    ldr r0, =0x020C4078 /* 寄存器 CCGR4 */
    str r1, [r0]

    ldr r0, =0x020C407C /* 寄存器 CCGR5 */
    str r1, [r0]

    ldr r0, =0x020C4080 /* 寄存器 CCGR6 */
    str r1, [r0]
    
    /* 2.设置 GPIO1_IO03 复用为 GPIO1_IO03 */
    ldr r0, =0x020E0068 /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
    ldr r1, =0x5        /* 设置寄存器 SW_MUX_GPIO1_IO3_BASE 的 MUX_MODE 为 5 */
    str r1, [r0]

    /* 3.设置 GPIO1_IO03 的 IO 属性
     * bit 16: 0 HYS关闭
     * bit [15:14]: 00 默认下拉
     * bit [13]: 0 kepper功能
     * bit [12]: 1 pull/kepper使能
     * bit [11]: 0 关闭开路输出
     * bit [7:6]: 10 速度100MHz
     * bit [5:3]: 110 R0/6驱动能力
     * bit [0]: 0 低转换率
     */
     ldr r0, =0x020E02F4 /* 寄存器 SW_PAD_GPIO1_IO03_BASE */
     ldr r1, =0x10B0
     str r1, [r0]

     /* 4.设置 GPIO1_IO03为输出 */
     ldr r0, =0x0209C004 /* 寄存器 GPIO1_GDIR */
     ldr r1, =0x00000008
     str r1, [r0]

     /* 5.打开 LED0，设置 GPIO1_IO03 输出低电平 */
     ldr r0, =0x0209C000 /* 寄存器 GPIO1_DR */
     ldr r1, =0
     str r1, [r0]


/**
 * @brief loop死循环 
 */
loop:
    b loop
    